package case2

import "fmt"

/** 接口示例2
《也是多态场景》
实际应用场景：
	我们编写一个简单程序，根据公司员工的个人薪资，计算公司的总支出。为了简单起见，我们假定支出的单位都是美元。
业务：
   Permanent(长期员工)、Contract(临时员工)
  长期员工（Permanent）的薪资是 基本薪资basicPay与 绩效薪资meritsPay相加之和，
  临时员工（Contract）只有 基本薪资basicPay。

*/

// 定义薪水计算器接口
type SalaryCalculator interface {
	calculate() int
}

// 长期员工 结构体
type permanent struct {
	id        int
	name      string
	basicPay  int //基本薪资
	meritsPay int //绩效薪资
}

// 实现长期员工 计算接口
func (p permanent) calculate() int {
	return p.basicPay + p.meritsPay
}

// 临时员工 结构体
type contract struct {
	id       int
	name     string
	basicPay int
}

// 实现临时员工 计算接口
func (c contract) calculate() int {
	return c.basicPay
}

func totoCall(s []SalaryCalculator) {
	total := 0
	for _, v := range s {
		total = total + v.calculate()
	}
	fmt.Println("计算公司的总支出:", total)
}

func Test() {

	p1 := permanent{1, "小明", 5000, 1500}
	p2 := permanent{2, "小红", 6000, 2000}
	c1 := contract{1, "张三", 3500}

	all := []SalaryCalculator{p1, p2, c1}
	totoCall(all)

}
